/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controlador;

import Modelo.Producto;
import Modelo.Servicio;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author diegomanguia
 */
public class ControlProdServ extends Conexion {

    public ControlProdServ() {
    }

    public ArrayList<Producto> listarProductos() {
        ArrayList<Producto> lista = null;
        String sql = "SELECT * FROM producto";
        Connection cn = null;
        try {
            cn = conectar();
        } catch (SQLException ex) {
        }

        try {
            lista = new ArrayList<>();
            PreparedStatement ps;
            ps = cn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Producto obj = new Producto(rs.getString("prod_codigo"),
                        rs.getString("prod_nombre"),
                        rs.getString("prod_descripcion"),
                        rs.getFloat("prod_precioUnitario"),
                        rs.getInt("prod_stock"), rs.getString("pro_codigo"),
                        rs.getString("img_codigo"));
                String aux=rs.getString("prom_codigo");
                obj.setCodPromocion(aux==null?-1:Integer.parseInt(aux));
                //System.out.println(obj);
                lista.add(obj);
            }
            desconectar(cn);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return lista;
    }

    public ArrayList<Servicio> listarServicios() {
        ArrayList<Servicio> lista = null;
        String sql = "Select * from servicio";
        Connection cn = null;
        try {
            cn = conectar();
        } catch (SQLException ex) {
            Logger.getLogger(ControlProdServ.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            lista = new ArrayList<>();
            PreparedStatement ps;
            ps = cn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Servicio obj = new Servicio(rs.getString("ser_codigo"),
                        rs.getString("ser_nombre"),
                        rs.getString("ser_descripcion"),
                        rs.getFloat("ser_precio"));
                lista.add(obj);
            }
            desconectar(cn);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        //System.out.println(lista.toString());
        return lista;
    }

    public boolean insertarProd(String nombre, String descripcion, 
            Float precioU, Integer stock, String codProveedor) {

        Connection cn = null;
        try {
            cn = conectar();
        } catch (SQLException ex) {
            Logger.getLogger(ControlProdServ.class.getName()).log(Level.SEVERE, null, ex);
        }

        boolean c = true;
        try {
            if (cn.getAutoCommit()) {
                cn.setAutoCommit(false);
            }
            PreparedStatement ps = cn.prepareStatement("insert into producto"
                    + "(pro_codigo,prod_nombre,prod_descripcion,"
                    + "prod_precioUnitario,prod_stock)"
                    + " values (?,?,?,?,?) ");
            ps.setString(1, codProveedor);
            ps.setString(2, nombre);
            ps.setString(3, descripcion);
            ps.setFloat(4, precioU);
            ps.setInt(5, stock);

            int a = ps.executeUpdate();

            if (a >= 1) {
               // JOptionPane.showMessageDialog(null, "Producto Registrado Correctamente");
                System.out.println("Producto Registrado Correctamente");
                cn.commit();
            }

        } catch (SQLException ex){
            System.out.println(ex.getErrorCode());
            ex.printStackTrace();
            deshacer(cn);
            c = false;
        }catch (Exception ex) {
            //Logger.getLogger(PryJDBC.class.getName()).log(Level.SEVERE, null, ex);
            
            ex.printStackTrace();
            deshacer(cn);
            c = false;

        }
        return c;
    }

    
    public void insertarServ(String nombre, String descripcion, Float precio) {

        Connection cn = null;
        try {
            cn = conectar();
        } catch (SQLException ex) {
            Logger.getLogger(ControlProdServ.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            if (cn.getAutoCommit()) {
                cn.setAutoCommit(false);
            }
            PreparedStatement ps = cn.prepareStatement("insert into SERVICIO"
                    + "(ser_nombre,ser_descripcion,"
                    + "ser_precio)"
                    + " values (?,?,?) ");
            ps.setString(1, nombre);
            ps.setString(2, descripcion);
            ps.setFloat(3, precio);

            int a = ps.executeUpdate();

            if (a >= 1) {
                JOptionPane.showMessageDialog(null, "Servicio Registrado Correctamente");
                System.out.println("Servicio Registrado Correctamente");
                cn.commit();
            }
            

        } catch (SQLException ex) {
            // JOptionPane.showMessageDialog(null, "clave ya registrada" + ex.getMessage());
        } catch (Exception ex) {
            //Logger.getLogger(PryJDBC.class.getName()).log(Level.SEVERE, null, ex);
            deshacer(cn);
        }
    }

    public void eliminarProd(Integer cod) {
        try {
            Connection cn = conectar();
            PreparedStatement ps = cn.prepareStatement("DELETE FROM producto "
                    + "WHERE prod_codigo=?");
            ps.setInt(1, cod);
            int num = ps.executeUpdate();
            if (num != 0) {
                JOptionPane.showMessageDialog(null, "Producto Eliminado");
            }
        } catch (SQLException sQLException) {
            
            int error=sQLException.getErrorCode();
            switch (error) {
                case 1451:
                    JOptionPane.showMessageDialog(null, "No se puede eliminar el producto porque es parte de una cotización.");
                    break;
                default:
                    //throw new AssertionError();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void eliminarProdProv(Integer cod) throws SQLException {

        Connection cn = conectar();
        PreparedStatement ps = cn.prepareStatement("DELETE FROM producto "
                + "WHERE pro_codigo=?");
        ps.setInt(1, cod);
        int num = ps.executeUpdate();
        if (num <= 0) {
            System.out.println("Error al eliminar.");
        } else {
            System.out.println("Se eliminó " + num + " productos asociados al"
                    + " proveedor " + cod);
        }
    }

    public void eliminarServ(Integer cod) {
        try {
            Connection cn = conectar();
            PreparedStatement ps = cn.prepareStatement("DELETE FROM servicio "
                    + "WHERE ser_codigo=?");
            ps.setInt(1, cod);
            int num = ps.executeUpdate();
            if (num != 0) {
                JOptionPane.showMessageDialog(null, "Servicio Eliminado");
            }
        } catch (SQLException sQLException) {
            sQLException.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void actualizarProd(String cod, String nombre, String descripcion,
            Float precioU, Integer stock, Integer codProveedor) {

        Connection cn = null;
        try {
            cn = conectar();
        } catch (SQLException ex) {
            Logger.getLogger(ControlProdServ.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            if (cn.getAutoCommit()) {
                cn.setAutoCommit(false);
            }

            PreparedStatement ps = cn.prepareStatement("UPDATE  producto SET  "
                    + "prod_nombre=?, prod_descripcion=?,prod_precioUnitario=?,"
                    + "prod_stock=?,pro_codigo=? "
                    + "WHERE prod_codigo=?");

            ps.setString(1, nombre);
            ps.setString(2, descripcion);
            ps.setFloat(3, precioU);
            ps.setInt(4, stock);
            ps.setInt(5, codProveedor);
            ps.setString(6, cod);

            int a = ps.executeUpdate();

            if (a >= 1) {
                JOptionPane.showMessageDialog(null, "Producto Actualizado Correctamente");
                System.out.println("Producto Actulizado Correctamente");
                cn.commit();
            }

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "clave ya registrada" + ex.getMessage());
        } catch (Exception ex) {
            //Logger.getLogger(PryJDBC.class.getName()).log(Level.SEVERE, null, ex);
            deshacer(cn);
        }

    }

    public void agregarImagen(String cod, String codImg) {

        Connection cn = null;
        try {
            cn = conectar();
        } catch (SQLException ex) {

        }

        try {
            if (cn.getAutoCommit()) {
                cn.setAutoCommit(false);
            }

            PreparedStatement ps = cn.prepareStatement("UPDATE  producto SET  "
                    + "img_codigo=? "
                    + "WHERE prod_codigo=?");

            ps.setString(1, codImg);
            ps.setString(2, cod);

            int a = ps.executeUpdate();

            if (a >= 1) {
                JOptionPane.showMessageDialog(null, "Imagen Registrada Correctamente");
                 System.out.println("Imagen " + codImg + " agregada al producto " + cod);
                cn.commit();
            }
            

        } catch (SQLException ex) {
            // JOptionPane.showMessageDialog(null, "clave ya registrada" + ex.getMessage());
            ex.printStackTrace();
        } catch (Exception ex) {
            //Logger.getLogger(PryJDBC.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
            deshacer(cn);
        }

    }

    public void actualizarServ(String cod, String nombre, String descripcion,
            Float precio) {

        Connection cn = null;
        try {
            cn = conectar();
        } catch (SQLException ex) {
            Logger.getLogger(ControlProdServ.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            if (cn.getAutoCommit()) {
                cn.setAutoCommit(false);
            }

            PreparedStatement ps = cn.prepareStatement("UPDATE  servicio SET  "
                    + "ser_nombre=?, ser_descripcion=?,ser_precio=? "
                    + "WHERE ser_codigo=?");

            ps.setString(1, nombre);
            ps.setString(2, descripcion);
            ps.setFloat(3, precio);
            ps.setInt(4, Integer.parseInt(cod));

            int a = ps.executeUpdate();

            if (a >= 1) {
                JOptionPane.showMessageDialog(null, "Servicio Actualizado Correctamente");
                System.out.println("Servicio Actualizado Correctamente");
                cn.commit();
            }

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "clave ya registrada" + ex.getMessage());
        } catch (Exception ex) {
            //Logger.getLogger(PryJDBC.class.getName()).log(Level.SEVERE, null, ex);
            deshacer(cn);
        }

    }

    public void importarProd(String nombre, Integer stock, Integer codProveedor) {
        Connection cn = null;
        try {
            cn = conectar();
        } catch (SQLException ex) {
            Logger.getLogger(ControlProdServ.class.getName()).log(Level.SEVERE, null, ex);
        }

        //String cod="";
        String descripcion = "Sin descripción";
        try {
            if (cn.getAutoCommit()) {
                cn.setAutoCommit(false);
            }

            PreparedStatement ps = cn.prepareStatement("UPDATE  producto SET  "
                    + "prod_descripcion=?,"
                    + "prod_stock=?,pro_codigo=? "
                    + "WHERE prod_nombre=?");

            ps.setString(1, descripcion);
            ps.setInt(2, stock);
            ps.setInt(3, codProveedor);
            ps.setString(4, nombre);

            int a = ps.executeUpdate();
            System.out.println("a: " + a);
            if (a == 1) {
                //JOptionPane.showMessageDialog(null, "Producto Actualizado Correctamente");
                cn.commit();
            } else if (a == 0) {
                System.out.println("A: " + a);
                System.out.println("No existe -> se agregará");
                deshacer(cn);
                insertarProd(nombre, descripcion, 0.0f, stock, codProveedor.toString());
            } else {
                deshacer(cn);
            }

        } catch (SQLException ex) {
            //JOptionPane.showMessageDialog(null, "clave ya registrada" + ex.getMessage());

            deshacer(cn);
            ex.printStackTrace();
        } catch (Exception ex) {
            //Logger.getLogger(PryJDBC.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
            deshacer(cn);
        }
    }
}
